"""
ImageMagick 配置模块
用于配置 MoviePy 使用 ImageMagick
"""

import os
import sys
from pathlib import Path


def _verify_imagemagick(binary_path):
    """
    验证可执行文件是否是 ImageMagick
    
    Args:
        binary_path: 可执行文件路径
    
    Returns:
        True 如果是 ImageMagick，False 如果不是
    """
    try:
        import subprocess
        result = subprocess.run(
            [binary_path, "-version"],
            capture_output=True,
            timeout=5,
            text=True
        )
        if result.returncode == 0:
            # 检查输出中是否包含 ImageMagick
            output = result.stdout.lower()
            return "imagemagick" in output or "magick" in output
        return False
    except Exception:
        return False


def find_imagemagick_binary():
    """
    自动查找 ImageMagick 可执行文件路径
    
    Returns:
        ImageMagick 可执行文件路径，如果未找到则返回 None
    """
    # 常见的 ImageMagick 安装路径
    possible_paths = [
        # Windows 常见路径
        r"C:\Program Files\ImageMagick-7.1.0-Q16-HDRI\magick.exe",
        r"C:\Program Files\ImageMagick-7.1.1-Q16-HDRI\magick.exe",
        r"C:\Program Files\ImageMagick-7.1.2-Q16-HDRI\magick.exe",
        r"C:\Program Files\ImageMagick-7.1.3-Q16-HDRI\magick.exe",
        r"C:\Program Files (x86)\ImageMagick-7.1.0-Q16-HDRI\magick.exe",
        r"C:\Program Files (x86)\ImageMagick-7.1.1-Q16-HDRI\magick.exe",
        r"C:\Program Files (x86)\ImageMagick-7.1.2-Q16-HDRI\magick.exe",
        r"C:\Program Files (x86)\ImageMagick-7.1.3-Q16-HDRI\magick.exe",
        # 自定义安装路径
        r"D:\apps\ImageMagick-7.1.2-Q16-HDRI\magick.exe",
        r"D:\ImageMagick\magick.exe",
        r"D:\Program Files\ImageMagick\magick.exe",
        # 系统 PATH 中的 magick
        "magick.exe",
        "magick",
        "convert.exe",
        "convert",
    ]
    
    # 首先检查环境变量
    if 'IMAGEMAGICK_BINARY' in os.environ:
        env_path = os.environ['IMAGEMAGICK_BINARY']
        if Path(env_path).exists():
            return env_path
    
    # 检查每个可能的路径
    for path in possible_paths:
        if path in ["magick.exe", "magick"]:
            # 优先使用 magick 命令（ImageMagick 7.x 推荐）
            import shutil
            found = shutil.which(path)
            if found:
                # 验证是否是 ImageMagick
                if _verify_imagemagick(found):
                    return found
        elif path in ["convert.exe", "convert"]:
            # convert 命令（可能是 Windows 自带的，需要验证）
            import shutil
            found = shutil.which(path)
            if found:
                # 排除 Windows 自带的 convert.exe
                if "system32" not in found.lower() and _verify_imagemagick(found):
                    return found
        else:
            # 检查文件是否存在
            if Path(path).exists():
                if _verify_imagemagick(path):
                    return path
    
    # 尝试在 Program Files 中搜索
    program_files_paths = [
        Path(r"C:\Program Files"),
        Path(r"C:\Program Files (x86)"),
    ]
    
    for program_files in program_files_paths:
        if program_files.exists():
            imagemagick_dirs = list(program_files.glob("ImageMagick*"))
            for img_dir in imagemagick_dirs:
                magick_exe = img_dir / "magick.exe"
                if magick_exe.exists():
                    # 验证是否是真正的 ImageMagick
                    if _verify_imagemagick(str(magick_exe)):
                        return str(magick_exe)
    
    return None


def configure_imagemagick(custom_path=None):
    """
    配置 MoviePy 使用 ImageMagick
    
    Args:
        custom_path: 自定义 ImageMagick 可执行文件路径
    
    Returns:
        True 如果配置成功，False 如果失败
    """
    # 确定 ImageMagick 路径
    if custom_path:
        imagemagick_path = custom_path
    else:
        imagemagick_path = find_imagemagick_binary()
    
    if not imagemagick_path:
        # 打印调试信息（仅在直接运行时）
        if __name__ == "__main__":
            print("[INFO] 未找到 ImageMagick")
        return False
    
    # 验证路径是否存在且是真正的 ImageMagick
    if not Path(imagemagick_path).exists() and imagemagick_path not in ["magick.exe", "magick", "convert.exe", "convert"]:
        if __name__ == "__main__":
            print(f"[ERROR] ImageMagick 路径不存在: {imagemagick_path}")
        return False
    
    # 如果是命令名称，先解析完整路径
    if imagemagick_path in ["magick.exe", "magick", "convert.exe", "convert"]:
        import shutil
        full_path = shutil.which(imagemagick_path)
        if full_path:
            imagemagick_path = full_path
        else:
            if __name__ == "__main__":
                print(f"[ERROR] 未找到命令: {imagemagick_path}")
            return False
    
    # 验证是否是真正的 ImageMagick
    if not _verify_imagemagick(imagemagick_path):
        if __name__ == "__main__":
            print(f"[ERROR] 找到的可执行文件不是 ImageMagick: {imagemagick_path}")
        return False
    
    # 设置环境变量
    os.environ['IMAGEMAGICK_BINARY'] = imagemagick_path
    
    # 重新加载 moviepy.config（如果已经导入）
    try:
        import moviepy.config
        import importlib
        importlib.reload(moviepy.config)
        
        # 验证配置
        if hasattr(moviepy.config, 'IMAGEMAGICK_BINARY'):
            moviepy.config.IMAGEMAGICK_BINARY = imagemagick_path
        
        return True
    except ImportError:
        # moviepy 还未导入，环境变量会在导入时生效
        return True


def test_imagemagick():
    """
    测试 ImageMagick 是否可用
    
    Returns:
        True 如果可用，False 如果不可用
    """
    try:
        from moviepy.video.VideoClip import TextClip
        # 尝试创建一个简单的 TextClip
        test_clip = TextClip("Test", fontsize=24, color='white', duration=0.1)
        test_clip.close()
        return True
    except Exception:
        return False


if __name__ == "__main__":
    # 测试配置
    print("正在查找 ImageMagick...")
    if configure_imagemagick():
        if test_imagemagick():
            print(f"[OK] ImageMagick 配置成功: {os.environ.get('IMAGEMAGICK_BINARY')}")
        else:
            print("[ERROR] ImageMagick 配置失败：测试 TextClip 时出错")
    else:
        print("[ERROR] 未找到 ImageMagick")
        print("\n安装 ImageMagick 的步骤:")
        print("1. 访问 https://imagemagick.org/script/download.php")
        print("2. 下载 Windows 版本 (推荐 Q16-HDRI)")
        print("3. 安装时选择 'Install legacy utilities (e.g. convert)'")
        print("4. 或者安装后手动配置路径")
